<?php


namespace App\Tools;


use App\Models\SalePlan;
use App\Models\SaleTask;
use App\Models\SystemConfig;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

/**
 * 获取本次执行的任务
 * Class FindTasks
 * @package App\Tools
 */
class FindTasks
{

    public $tasks;


    public function __construct()
    {
        $this->tasks = [];

    }

    /**
     * 获取所有任务
     * @return array
     */
    public function getList()
    {
        $merchantBeyond = ["sale"=>[], "flow"=>[]];

        // 销售任务
        $salePlanList = SalePlan::whereIn('status', [1, 2])->orderBy(DB::raw('RAND()'))->get();
        //每次派单最大计划数
        $taskMaxNum = SystemConfig::findValue('dispatch.maxPlanNum', 100);

        // 销量任务单
        foreach ($salePlanList as $value) {
            // 未到开始时间，跳过循环
            if ($value->start_time > time()) {
                continue;
            }
            // 超过开始时间的任务 修改计划状态
            if ($value->status == 1) {
                //超过开始时间且等待执行的任务 修改状态为正在执行
                try {
                    DB::transaction(function () use ($value) {
                        SalePlan::where('id', $value->id)->update(['status' => 2]);
                    });
                }catch (QueryException $exception) {
                    Log::info($exception->getMessage());
                    break;
                }
            }
            // 超时任务
            if (!empty($value->over_time) && $value->over_time > 0 && time() > $value->over_time) {
                continue;
            }
            // 查询任务状态为 1：等待执行 的销量单
            $saleTaskList = SaleTask::where('plan_id', $value->id)->where('status', 1)->get();
            if (empty($saleTaskList)) {
                continue;
            }
            // 获取等待执行和正在执行的任务
            $this->getSaleTask($saleTaskList->toArray(), $value->toArray());

            // 订单数量 大于等于 最大任务数量-10 跳出循环
            if (count($this->tasks) >= ($taskMaxNum-10))break;

            if (!array_key_exists($value->merchant_id, $merchantBeyond['sale'])) {
                $merchantBeyond['sale'][$value->merchant_id] = 1;
            }else{
                $merchantBeyond['sale'][$value->merchant_id]++;
            }
        }

        // 随机打乱数组数据
        shuffle($this->tasks);
        // 只返回50条数据
        return array_slice($this->tasks, 0, 50);
    }


    /**
     * 获取销售任务等待执行和正在执行的任务
     * @param $saleTaskList
     * @param $planInfo
     */
    private function getSaleTask($saleTaskList, $planInfo)
    {
        foreach ($saleTaskList as $value) {
            if (empty($value['begin_time']) || $value['begin_time'] > time()) {
                continue;
            }else{
                // 派单超过6小时
                if (time() - $value['begin_time'] >= 6*60*60 && time() - $value['create_time'] >= 6*60*60) {
                    $key = getWxworkKey('dispatch');
                    // 发送到企业微信机器人
                    logWxwork('订单'. $value['task_code']. '(id:'.$value['id'].')派单超过6小时', $key, true);
                }
                $value['plan_type'] = 1;
                $value['plan_info'] = $planInfo; // 直接赋值
                $isZqd = $planInfo['zqd'] == 1 ? true : false;
                $value['zqd'] = $isZqd;
                array_push($this->tasks, $value);
            }
        }
    }

}
